從標題就開始鬼畫符是怎樣?
謀啦,這是今天要介紹的主角群啦!
這幾個邏輯運算子: &&
and
||
or
一開始都以為他們只是彼此的替身而已,殊不知,
打開irb來做個簡單的驗證:
首先很簡單的定義兩個變數:
a = true
b = false
然後,一起來見證奇蹟的時刻:
c = a and b
=> false
c
=> true # 噠拉!!見證奇蹟的時刻!!!
d = a && b
=> false
d
=> false
有注意到嗎?and
和 &&
看起來並不是完全相同的呢!
要了解上面的原因,得先知道下面這些概念:
=
和 and
相比,=
有比較高的優先權,=
和 &&
相比,&&
有比較高的優先權,姆...簡單的來說呢,上面的程式碼其實是這樣的:
((c = a) and b)
=> false
c
=> true # 因為 = 有比較高的優先權,a 已經指派給 c 了,所以c 是 true 喔!
(d = (a && b))
=> false
d
=> false # 因為 && 有比較高的優先權,所以d 才會是 false 喔!
原來一切都是 Short-Circuit Evaluationy 做得好事,中文大概是翻作:
最短路徑評估。
When the first argument of the AND function evaluates to false,
the overall value must be false;
and when the first argument of the OR function evaluates to true,
the overall value must be true.
順著上面的解釋,來看看 or
true || fun() # true
false || fun() # undefined method `fun' for main:Object
true or fun() # true
false or fun() # undefined method `fun' for main:Object
姆... 所以呢?
第一點比較好理解,第二點的話看看下面的範例,會比較有感覺吧:
next if result = 2.even?
# 可以改寫成
result = 2.even? and next
cook_dinner() or raise(RuntimeError, "Not in the mood.")
# 可以改寫成
raise(RuntimeError, "Not in the mood.") unless cook_dinner()
大概就是這樣,腦袋鈍鈍的,就先這樣吧!
鐵人賽,我們明天見!!
參考資料:
Day22 and 和 or 比較
Understanding Boolean Operator Precedence in Ruby
Difference between && and and in Ruby
Ruby code整理系列 ||= 的使用